﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenSource.UPnP;
using System.Windows;
using System.Windows.Controls;
using System.Reflection;

namespace TestClient
{
    class ServeurClientUPnP
    {
        private UPnPDevice root;
        private UPnPService list;

        /**
           * \nb_dev1        le nombre de devices connectés
        */
        private int nb_dev1;
        static int ctr = 0;
        int aa = 2;
        private UPnPSmartControlPoint cp2;
        private UPnPSmartControlPoint cp1;
        UPnPArgument[] args2 = new UPnPArgument[3];
               
        TestClient.Client cl=new TestClient.Client();


        /**
         * \ServeurClientUPnP            Constructeur de la classe 'ServeurClientUPnP'
         
        */
        public ServeurClientUPnP()
		{
            nb_dev1 = 0;	

			root = UPnPDevice.CreateRootDevice(360, 1.0, "");
            root.FriendlyName = "ServeurClientUPnP";
            root.DeviceURN = "urn:schemas-upnp-org:device:ServeurClientUPnP:1";
			root.HasPresentation = false;
			root.Manufacturer = "sbai";
			root.ModelName = "UPnP sample for kids";
			root.UniqueDeviceName = "12345678-153f-430d-82f3-dff320c17503";

            list = new UPnPService(1.0, "SampleClient", "urn:schemas-upnp-org:service:SampleClient:1", true, this);

            list.AddMethod("getresultat");
            list.AddMethod("AppelMethode");
			root.AddService(list);
			root.Advertise();
		}


        /**
        * \startUPnP       pour démarrer le device
        */
        public void startUPnP(){
			root.StartDevice();
            Console.WriteLine("ServeurClientUPnP start");
		}



        /**
       * \stopUPnP       pour arrêter le device

       */
		public void stopUPnP(){
			root.StopDevice();
		}


        /**
       * \getresultat      une méthode intermédiaire pour récupérer le nom de la méthode que le serveur veut appeler
       * \param    meth    le nom de la méthode que le serveur veut appeler.
       */
        public void getresultat(string meth) {

            Console.WriteLine("méthode getresultat est appelée : "+meth);

            //pour lister les méthodes d'une classe
            Console.WriteLine("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");

            string chh = AppelMethode(meth);
            Console.WriteLine("Resultat final esttttt   :::::::   "+chh);
        }


       
 
        /**
       * \AppelMethode        Dans cette méthode j'ai utilisé la réflexion pour appeler dynamiquement des méthodes côté client.
       * \param    strParam   le nom de la méthode que le serveur veut appeler.
       */
        public string AppelMethode(string strParam)
        {
            // On récupère le Type de la classe elle-même
            Type oType = this.GetType();
           
            // On va récupérer la liste des méthodes qui existent dans la classe 'TestReflection'
            MethodInfo[] ListMethods = oType.GetMethods();
            object objVal = null;
            // Donc pour chaque méthode :
            foreach (MethodInfo mi in ListMethods)
            {
                // Si le nom de la méthode est égale à "Appel_" + strPAram
                if (mi.Name.Equals(strParam))
                {
                    // Alors on 'exécute' cette méthode que l'on a trouvée
                    // On sait qu'elle retourne "quelqu'chose". Donc on récupère ce quelque chose
                    objVal = mi.Invoke(this, null);
                    // On sort de la boucle foreach
                    break;
                }
            }
            // Si on a rien trouvé, parce que objVal est resté null
            // Tu fais ce que tu veux. Moi j'exceptionne.
            if (objVal == null)
                throw new Exception("Erreur dans l'invocation des méthodes dynamiquement...");
            // Sinon, je retourne la valeur string du résultat
            return objVal.ToString();
        }


        /**
       * \button1_Click       la méthode liée au click sur le button1.
        */
        public string button1_Click()
        {
            
            sendParametre("Message", "Text", "Bonjouurrrrrrrr");
                       
            return "SOB7ANAKA RABI MA A3DHAMA CHA2NAKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK";
           
        }


        /**
        * \button2_Click       la méthode liée au click sur le button2.
        */
        public string button2_Click()
        {
            
            sendParametre("textBlock1", "Text", "Enfin j'ai généré mon interface");

            return "SOB7ANAKA RABI";

        }

        public string btnNext_Click()
        {

            Console.WriteLine("un click sur le button btnNext");

            ctr++;
            
            if (ctr == 1)
            {

                sendParametre("image1", "UriSource", "http://www.linternaute.com/nature-animaux/magazine/photo/les-100-paysages-de-france/image/etretat-262711.jpg");

                
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr+aa;
                string zzc = ii.ToString();
                Console.WriteLine("zzc esttttttttttt   : "+zzc);
                sendParametre("progressBar1", "Value", zzc);
            }
           else if (ctr == 2)
            {

                sendParametre("image1", "UriSource", "http://tigresse888.t.i.pic.centerblog.net/o/74184583.jpg");
               
                aa++;
               
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr+aa;
                string zzc = ii.ToString();
            
                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
            }
           else if (ctr == 3)
            {

                sendParametre("image1", "UriSource", "http://www.midilibrevoyages.com/imgfr/europe/autriche-tyrol-2.jpg");
                
                aa++;
                
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr+aa;
                string zzc = ii.ToString();

                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
            }
           else if (ctr == 4)
            {

                sendParametre("image1", "UriSource", "http://www.interalpen.com/image/medium/fr/sejour-motivation-hiver-autriche.jpg");
                aa++;
               
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" +aa);
                int ii = ctr+aa;
                string zzc = ii.ToString();

                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
           }
            else if (ctr == 5)
            {

                sendParametre("image1", "UriSource", "http://www.consigliando.it/wp-content/uploads/2011/01/amsterdam.jpg");
                aa++;
               
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr + aa;
                string zzc = ii.ToString();

                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
            }
            else if (ctr == 6)
            {

                sendParametre("image1", "UriSource", "http://img0.svstatic.com/wallpapers/8c73c2932f94f48f44bc8fa8fb47c9aa_large.jpeg");
                aa++;
                
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr + aa;
                string zzc = ii.ToString();

                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
            }
            else if (ctr == 7)
            {

                sendParametre("image1", "UriSource", "http://faistoilabelle.files.wordpress.com/2011/04/venise_940x705.jpg");
                aa++;
               
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr + aa;
                string zzc = ii.ToString();

                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
            }

            else if (ctr == 8)
            {

                sendParametre("image1", "UriSource", "http://photos.hotelsclick.com/TN/HAMM/46780/5.jpg");
                aa++;
                
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr + aa;
                string zzc = ii.ToString();

                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
            }
            else if (ctr == 9)
            {

                sendParametre("image1", "UriSource", "http://blog.govoyages.com/wp-content/uploads/grece-crete.jpg");
                aa++;
                
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr + aa;
                string zzc = ii.ToString();

                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
            }
            else if (ctr == 10)
            {

                sendParametre("image1", "UriSource", "http://img.1.vacanceo.net/classic/207520.jpg");
                aa++;
               
                Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
                int ii = ctr + aa;
                string zzc = ii.ToString();

                Console.WriteLine("zzc esttttttttttt   : " + zzc);
                sendParametre("progressBar1", "Value", zzc);
            }

            else if (ctr > 10) {

            aa=2;
            ctr = 0;
            Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
            if (aa > 19) { aa = 2; }

            btnNext_Click();
            }

            return "SOB7ANAKA RABI";
            
        }




        public string btnFirst_Click()
       {

           Console.WriteLine("un click sur le button btnFirst");
           ctr--;

           if (ctr == 1)
           {

               sendParametre("image1", "UriSource", "http://www.linternaute.com/nature-animaux/magazine/photo/les-100-paysages-de-france/image/etretat-262711.jpg");
               aa--;
               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();
               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
              
           }
           else if (ctr == 2)
           {

               sendParametre("image1", "UriSource", "http://tigresse888.t.i.pic.centerblog.net/o/74184583.jpg");
               aa--;
               
               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
              
           }
           else if (ctr == 3)
           {

               sendParametre("image1", "UriSource", "http://www.midilibrevoyages.com/imgfr/europe/autriche-tyrol-2.jpg");
               aa--;

               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
              
           }
           else if (ctr == 4)
           {

               sendParametre("image1", "UriSource", "http://www.interalpen.com/image/medium/fr/sejour-motivation-hiver-autriche.jpg");
               aa--;

               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
           }
           else if (ctr == 5)
           {

               sendParametre("image1", "UriSource", "http://www.consigliando.it/wp-content/uploads/2011/01/amsterdam.jpg");
               aa--;

               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
           }
           else if (ctr == 6)
           {

               sendParametre("image1", "UriSource", "http://img0.svstatic.com/wallpapers/8c73c2932f94f48f44bc8fa8fb47c9aa_large.jpeg");
               aa--;

               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
           }
           else if (ctr == 7)
           {

               sendParametre("image1", "UriSource", "http://faistoilabelle.files.wordpress.com/2011/04/venise_940x705.jpg");
               aa--;

               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
           }

           else if (ctr == 8)
           {

               sendParametre("image1", "UriSource", "http://photos.hotelsclick.com/TN/HAMM/46780/5.jpg");
               aa--;

               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
           }
           else if (ctr == 9)
           {

               sendParametre("image1", "UriSource", "http://blog.govoyages.com/wp-content/uploads/grece-crete.jpg");
               aa--;

               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
           }
           else if (ctr == 10)
           {

               sendParametre("image1", "UriSource", "http://img.1.vacanceo.net/classic/207520.jpg");
               
               Console.WriteLine("aaaaaaaaaaaaaaaaaaa" + aa);
               int ii = ctr + aa;
               string zzc = ii.ToString();

               Console.WriteLine("zzc esttttttttttt   : " + zzc);
               sendParametre("progressBar1", "Value", zzc);
           }




           else if (ctr < 1)
           {

             
               ctr = 11;
               aa = 11;

               btnFirst_Click();
           }

           

            return "SOB7ANAKA RABI";
        }
       
     









        /**
      * \sendParametre         pour envoyer le resultat final au serveur pour qu'il puisse faire 
         * la mise à jour de l'interface graphique générée
       * \param    component    le nom d'un composant de l'interface graphique générée.
       * \param    propriete    la propriété du composant.
       * \param    valeur       la valeur de la propriété du composant à mettre à jour.
      */
        public void sendParametre(string component, string propriete, string valeur)
        {
            args2[0] = new UPnPArgument("component", component);
            args2[1] = new UPnPArgument("propriete", propriete);
            args2[2] = new UPnPArgument("valeur", valeur);
            cp2 = new UPnPSmartControlPoint(new UPnPSmartControlPoint.DeviceHandler(setResult));
        
        }


        public void sendParametre2(string component, string propriete, string valeur)
        {
            args2[0] = new UPnPArgument("component", component);
            args2[1] = new UPnPArgument("propriete", propriete);
            args2[2] = new UPnPArgument("valeur", valeur);
            cp2 = new UPnPSmartControlPoint(new UPnPSmartControlPoint.DeviceHandler(setResult));

        }

        /**
        * \Search               méthode intermédiaire dans la recherche d'un device sur le réseau
        
        */
        public void Search()
        {
           
            cp1 = new UPnPSmartControlPoint(new UPnPSmartControlPoint.DeviceHandler(NewDevice));

            cp1.OnRemovedDevice += new UPnPSmartControlPoint.DeviceHandler(DeviceQuit);

            cp1.Rescan();


        }



        /**
       * \DeviceQuit               affiche un message si un device a quitté le réseau
       * \param    sender1         sender1 pour le sender qui a déclenché la méthode.
       * \param    device          device est le device qui va quitter le réseau.
       */

        public void DeviceQuit(UPnPSmartControlPoint sender1, UPnPDevice device)
        {

            Console.Out.WriteLine("ClientSurfaceServeur2 quit: " + nb_dev1);
            nb_dev1--;

        }



        /**
        * \NewDevice                pour la recherche d'un device sur le réseau.
         * \param    sender1        sender1 pour le sender qui a declencher la methode.
        * \param    device          device est le device qui va apparaitre sur réseau.
         */
        public void NewDevice(UPnPSmartControlPoint sender, UPnPDevice device)
        {

            if (device.FriendlyName != "ClientSurfaceServeur2")
            {
                Console.WriteLine("ignoring " + device.FriendlyName);
                return;
            }

            nb_dev1++;

            Console.WriteLine("ClientSurfaceServeur2 found: " + nb_dev1);
        }



        /**
        * \NewDevice                la recherche du device sur le réseau, ici la recherche est suivant le nom du device et 
         * pour l'invocation d'une méthode distance d'un device détecté sur le réseau.
         * \param    sender1        sender1 pour le sender qui a declencher la methode.
         * \param    device          device est le device qui va apparaitre sur réseau.
         */
        public void setResult(UPnPSmartControlPoint sender, UPnPDevice device)
        {

            if (device.FriendlyName == "ClientSurfaceServeur2")
            {
                Console.WriteLine("trueeeeeeeeeeeeeeeee nchalah");

                UPnPService serv = device.GetService("Sample2");

                if (serv == null)
                {
                    Console.Error.WriteLine("Could not find service `Sample2' in device ");
                }

                Console.WriteLine("service  Sample2  in device `ClientSurfaceServeur2' is Found");

                serv.InvokeSync("call", args2);
            }

        }
    }
}
